/*Esta e a classe que cuida dos metodos que serao compartilhados entre as threads carros e
 * pedestres criadas. Esses metodos sao garantem a consistencia dos dados.
 */

package principal;

import carros.Carro;
import principal.Faixa;

public class Monitor {
	private static Monitor monitor;
	public Faixa[] faixas;
	private int temPedestre = 0;

	private Monitor(){
		faixas = new Faixa[Simulacao.getInstance().getNumeroDeFaixas()];
		for (int j = 0; j < faixas.length; j++) {
			faixas[j] = new Faixa();
		}		
	}

	public synchronized int getTemPedestre() {
		return temPedestre;
	}
	
	public synchronized int mudaDeFaixa(Carro carro, String direcao){
		int faixaOrigem = carro.getFaixa();
		int faixaDestino = 0;
		/*int pos = faixas[faixaOrigem].getPosicaoDoCarroNaFila(carro);
		faixas[faixaOrigem].removerCarroDaFila(pos);*/
		//faixas[faixaDestino].adicionaCarroNaFila
		
		if(direcao.equals("direita")) {
			//System.out.println("Origem: " + faixaOrigem + " Destino: " + faixaDestino);
			if(faixaOrigem >=  (faixas.length - 1)) return 0;
			faixaDestino = faixaOrigem + 1;
		} else {
			if(direcao.equals("esquerda")) {
				if(faixaOrigem <=  0) return 0;
				faixaDestino = faixaOrigem - 1;
			}
		}
		
		//System.out.println("FaixaDestino: "+ faixaDestino);
		faixas[faixaDestino].insereCarroNoMeioDaFaixa(carro);
		
		carro.setFaixa(faixaDestino);
		
		return 1;
	}
	
	public synchronized void setTemPedestre(int temPedestre) {
		this.temPedestre = temPedestre;
	}
	
	public static Monitor getInstance(){
		if(monitor == null) monitor = new Monitor();
		return monitor;

	}
	
	public synchronized int quantoAnda(Carro a){
		return faixas[a.getFaixa()].quantoAnda(a);
		
	}

	public synchronized void entraNaFila(Carro a){
		faixas[a.getFaixa()].adicionarCarroNaFila(a);
	}
	
	public synchronized void saiDaFila(Carro a){
		faixas[a.getFaixa()].removerCarroDaFila();
	}
}
